"""第二组，   组名：        口号：
创建一个基于文本的课程时间表生成器，允许学生输入一周内的课程名称和时间（按整点计算），
每次运行可以输入一节课的信息，然后将这些信息格式化并保存到文件中，并随时可以格式化并打印出来。

成员：韦景丹，甘振港，肖平湖，牙文彬（组长）
分工及编写函数部分： 甘振港：课程信息输入，def input_course():
                 韦景丹：课程信息整合，def merge_course_info(existing_dict, new_entry):
                 肖平湖：读写文件，def duzhuan(file_path, default_content):
                 牙文彬：格式化并打印，def format_and_print(file_path, course_dict)和def main():

最终实现效果
程序能够通过文本输入收集课程安排。
将这些信息格式化，并保存到一个文本文件中，文件可以重复读取和写入。
每次输入完成程序能够将文件内容格式化为每一行为一个星期的课程信息，课程之间用\t字符分隔，打印到屏幕上。"""

import sys
def input_course():
    """
    提示用户输入课程信息，并返回新的课程信息字典。

    :return: 新的课程信息字典，格式为 {周X: {时间Y: 课程Z}}
    """
    new_entry = {}
    while True:
        try:
            # 提示用户输入星期几
            week = input("请输入星期几（例如：星期一）：").strip()
            if week not in ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]:
                print("输入的星期几不正确，请重新输入。")
                continue

            # 提示用户输入课程名称
            course_name = input("请输入课程名称：").strip()
            if not course_name:
                print("课程名称不能为空，请重新输入。")
                continue

            # 提示用户输入上课时间
            time_input = input("请输入上课时间（24小时制，整点，例如：8）：").strip()
            time = int(time_input)
            if not (0 < time < 25):
                print("上课时间必须在1到24之间，请重新输入。")
                continue

            # 检查是否已有课程
            if week in new_entry:
                if time in new_entry[week]:
                    print(f"在 {week} 的 {time} 点已经有课程 {new_entry[week][time]}，请重新输入。")
                    continue
            else:
                new_entry[week] = {}

            # 添加课程信息
            new_entry[week][time] = course_name

            # 询问用户是否继续输入
            cont = input("是否继续输入课程信息？（y/n）：").strip().lower()
            if cont != 'y':
                break
        except ValueError:
            print("输入的时间格式不正确，请输入一个整数。")
            continue
        except KeyboardInterrupt:
            print("\n程序被用户中断。")
            sys.exit()
    return new_entry
def merge_course_info(existing_dict, new_entry):
    """
    合并已有的课程信息字典和新的课程信息字典，检测冲突。

    :param existing_dict: 已有的课程信息字典，格式为 {周1: {时间1: 课程1, ...}, ...}
    :param new_entry: 新的课程信息字典，格式为 {周X: {时间Y: 课程Z}}
    :return: 合并后的课程信息字典，如果有冲突则返回 None 并退出程序
    """
    conflict = False
    conflict_info = []

    # 遍历新的课程信息，检查冲突
    for week_day, time_courses in new_entry.items():
        for time, course in time_courses.items():
            if week_day in existing_dict and time in existing_dict[week_day]:
                conflict = True
                conflict_info.append((week_day, time, existing_dict[week_day][time]))

    if conflict:
        # 打印冲突信息并退出程序
        print("检测到课程时间冲突:")
        for week_day, time, existing_course in conflict_info:
            print(f"第{week_day}天的{time}点已有{existing_course}课")
        sys.exit()

    # 如果没有冲突，则合并字典
    existing_dict.update(new_entry)
    return existing_dict

def duzhuan(file_path, default_content):
    """
    读取课程信息文件，如果文件不存在则创建并初始化。

    :param file_path: 课程信息文件路径
    :param default_content: 默认的课程信息字典
    :return: 读取或初始化的课程信息字典
    """
    try:
        with open(file_path, "r", encoding='UTF-8') as file:
            content = file.read()
            if content.strip() == "":#如果文件为空，则返回一个空字典
                return {}
            content1 = eval(content)
            if not isinstance(content1, dict):
                print("课程文件内容格式不正确。")
                sys.exit()
            return content1
    except FileNotFoundError:
        print(f"文件{file_path}不存在，正在创建新文件...")
        with open(file_path, "w", encoding='UTF-8') as file:
            file.write(str(default_content))
        return default_content
    except Exception as e:
        print(f"读取文件时发生错误: {e}")
        sys.exit()

def format_and_print(file_path, course_dict):
    """
    格式化并打印课程信息，并将其保存到文件中。

    :param file_path: 课程信息文件路径
    :param course_dict: 课程信息字典
    """
    # 格式化课程信息
    formatted_info = ""
    for week, courses in course_dict.items():
        course_in_week = ""
        for time, name in courses.items():
            course_in_week += f"{time}点有{name}课\t"
        formatted_info += f"{week}：{course_in_week}\n"

    # 打印课程信息
    print("\n当前课程表：")
    print(formatted_info)

    # 保存课程信息到文件
    try:
        with open(file_path, "w", encoding='UTF-8') as file:
            file.write(formatted_info)
    except Exception as e:
        print(f"写入文件时发生错误: {e}")
        sys.exit()

def main():
    file_path = "course_schedule.txt"
    default_course_info = {}

    # 读取现有的课程信息
    existing_course_info = duzhuan(file_path, default_course_info)

    # 提示用户输入新的课程信息
    new_course_info = input_course()

    # 合并课程信息
    merged_info = merge_course_info(existing_course_info, new_course_info)

    # 格式化并打印课程信息，同时保存到文件中
    format_and_print(file_path, merged_info)

if __name__ == "__main__":
    main()